
/**
		proc
		view
		table
		table function
		function
		index
		trigger
**/
-- for dbdevassist
-- 2020-01-23 23:00:00
-- 注意, 本系统不依赖于objectid, 因为可能会变
-- 本系统只用于中文环境, 但也都用上nvarchar
-- 2020-02-07 20:00:00 FOR V2
-- 
-- 2020-05-03 restart

-- ID
-- 需要配合存储过程处理
--DROP TABLE dbo.yt_id
GO
CREATE TABLE dbo.yt_id(
		sID				INT NOT NULL,
		xTableName		NVARCHAR(200) NOT NULL,
		xBeginValue		INT NOT NULL,	-- also default value
		xEndValue		INT NOT NULL,
		xCurrentValue	INT NOT NULL,
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,			-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_id PRIMARY KEY NONCLUSTERED (sID)
)
GO
CREATE CLUSTERED INDEX idx_yt_id_xTableName  ON yt_id(xTableName)
GO
/**
INSERT INTO dbo.yt_id(xTableName, xBeginValue, xEndValue, xCurrentValue, sCreateTime, sLastUpdate, sStatus, sVersion)
VALUES()
GO
**/
-- 每个ID给一千万的取值范围应该够用了
DECLARE @i INT = 0, @j INT = 10000000
WHILE @i < 20
BEGIN
		INSERT INTO dbo.yt_id(sID,xTableName, xBeginValue, xEndValue, xCurrentValue, sCreateTime, sLastUpdate, sStatus, sVersion)
		VALUES(@i + 1, '', @i * @j, @i * @j + @j, @i * @j, GETDATE(), GETDATE(), 2, 1)
		SET @i += 1
END
GO

--DROP TABLE dbo.yt_user
GO

CREATE TABLE dbo.yt_user(
		sID				INT NOT NULL,
		xAccount		VARCHAR(100) NOT NULL,
		xPassword		CHAR(32) NOT NULL,
		xName			NVARCHAR(200) NOT NULL,
		xOption			INT NOT NULL,			-- 选项, 也是用二进制位. 1:是否启用自动登录(启用的话,只要PCName或者IP对应上了就自动登录)
		xPCName			NVARCHAR(200),
		xIP				VARCHAR(15),
		xNote			NVARCHAR(MAX),
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,			-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_user PRIMARY KEY CLUSTERED (sID)
)
GO

		

INSERT INTO dbo.yt_user(sID, xAccount, xPassword, xName, xOption, xPCName, xIP, xNote, sCreateTime, sLastUpdate, sStatus, sVersion)
VALUES(0, 'admin', 'admin', 'admin', 0, '', '', '', GETDATE(), GETDATE(), 5, 1)
GO
UPDATE dbo.yt_id SET xTableName = 'yt_user', sLastUpdate = GETDATE(), sStatus = 3, sVersion = 2 WHERE sID = 1
GO

-- 数据字典
--DROP TABLE dbo.yt_dic
GO
-- 有哪些field关联这个字典的动态查出来
CREATE TABLE dbo.yt_dic(
		sID				INT  NOT NULL,
		xName			NVARCHAR(200) NOT NULL,		-- 名称
		xNote			NVARCHAR(MAX) NOT NULL,
		sCreateTime		DATETIME NOT NULL,
		rAuthor_ID		INT NOT NULL,				-- 创建者
		rOwner_ID		INT NOT NULL,				-- 当前拥有者
		rMender_ID		INT NOT NULL,				-- 提交
		rChecker_ID		INT NOT NULL,				-- 复核
		rAuditor_ID		INT NOT NULL,				-- 审核
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,			-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_dic PRIMARY KEY CLUSTERED (sID)
)
GO

UPDATE dbo.yt_id SET xTableName = 'yt_dic', sLastUpdate = GETDATE(), sStatus = 3, sVersion = 2 WHERE sID = 2
GO
--DROP TABLE dbo.yt_dic_item
GO
CREATE TABLE dbo.yt_dic_item(
		mID		INT NOT NULL,
		dID		INT NOT NULL,
		sIndex	INT NOT NULL,
		xValue	INT NOT NULL,			-- 取值
		xName	NVARCHAR(200) NOT NULL,	-- 名称
		xNote	NVARCHAR(MAX) NOT NULL,	-- 说明
		CONSTRAINT pk_yt_dic_item PRIMARY KEY CLUSTERED (mID,dID)
) 
GO
-- 类型
--DROP TABLE dbo.yt_type
GO

CREATE TABLE dbo.yt_type(
		sID		INT NOT NULL,
		--
		xCode	CHAR(2) NOT NULL,
		xName	NVARCHAR(100) NOT NULL,
		xDesc	NVARCHAR(100) NOT NULL,
		sIndex	INT NOT NULL,						-- 显示顺序. >0时才显示.
		xType	INT NOT NULL,					-- 类型. 决定有哪个明细表的.同样使用二进制位. 1主表, 2输入参数, 4输出参数
		--
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,			-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_type PRIMARY KEY CLUSTERED (sID)
)

GO

INSERT INTO yt_type(sID, xCode, xName, xDesc, sIndex, xType, sCreateTime, sLastUpdate, sStatus, sVersion) VALUES
		(1, 'AF',	N'',			N'聚合函数 (CLR)', 		0, 0, GETDATE(), GETDATE(), 5, 1),
		(2, 'C', 	N'',			N'CHECK 约束', 			0, 1, GETDATE(), GETDATE(), 5, 1),
		(3, 'D', 	N'',			N'DEFAULT（约束或独立）',	0, 1, GETDATE(), GETDATE(), 5, 1),
		(4, 'F', 	N'',			N'FOREIGN KEY 约束', 	0, 1, GETDATE(), GETDATE(), 5, 1),
		(5, 'FN', 	N'标量函数',	N'SQL 标量函数', 			8, 7, GETDATE(), GETDATE(), 5, 1),
		(6, 'FS', 	N'',			N'程序集 (CLR) 标量函数', 	0, 0, GETDATE(), GETDATE(), 5, 1),
		(7, 'FT', 	N'',			N'程序集 (CLR) 表值函数', 	0, 0, GETDATE(), GETDATE(), 5, 1),
		(8, 'IF', 	N'内联表值函数',N'SQL 内联表值函数', 	11,7, GETDATE(), GETDATE(), 5, 1),
		(9, 'IT', 	N'',			N'内部表', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(10, 'P', 	N'存储过程',	N'SQL 存储过程', 			2, 7, GETDATE(), GETDATE(), 5, 1),
		(11, 'PC ', N'',			N'程序集（CLR）存储过程', 	0, 0, GETDATE(), GETDATE(), 5, 1),
		(12, 'PG', 	N'',			N'计划指南', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(13, 'PK ', N'主键',		N'PRIMARY KEY 约束', 	7, 3, GETDATE(), GETDATE(), 5, 1),
		(14, 'R', 	N'',			N'规则（旧式，独立）', 		0, 0, GETDATE(), GETDATE(), 5, 1),
		(15, 'RF', 	N'',			N'复制筛选过程', 			0, 0, GETDATE(), GETDATE(), 5, 1),
		(16, 'S', 	N'',			N'系统基表', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(17, 'SN',	N'',			N'同义词', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(18, 'SO', 	N'',			N'序列对象', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(19, 'U', 	N'数据表',		N'表（用户定义类型）', 		1, 5, GETDATE(), GETDATE(), 5, 1),
		(20, 'V', 	N'视图',		N'视图', 				3, 5, GETDATE(), GETDATE(), 5, 1),
		(21, 'EC', 	N'',			N'Edge 约束', 			0, 0, GETDATE(), GETDATE(), 5, 1),
		-- 2012+
		(22, 'SQ', 	N'',			N'服务队列', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		(23, 'TA ', N'',			N'程序集 (CLR) DML 触发器', 0,0,GETDATE(), GETDATE(), 5, 1),
		(24, 'TF', 	N'表值函数',	N'SQL 表值函数', 			4, 7, GETDATE(), GETDATE(), 5, 1),
		(25, 'TR', 	N'触发器',		N'SQL DML 触发器', 		9, 1, GETDATE(), GETDATE(), 5, 1),
		(26, 'TT', 	N'表类型',		N'表类型', 				6, 5, GETDATE(), GETDATE(), 5, 1),
		(27, 'UQ ', N'唯一约束',	N'UNIQUE 约束', 			10,1, GETDATE(), GETDATE(), 5, 1),
		(28, 'X', 	N'',			N'扩展存储过程', 			0, 0, GETDATE(), GETDATE(), 5, 1),
		-- 2016+
		(29, 'ET', 	N'',			N'外部表', 				0, 0, GETDATE(), GETDATE(), 5, 1),
		-- 额外
		(99, '', 	N'索引',		N'索引', 				5, 5, GETDATE(), GETDATE(), 5, 1)

--
--DROP TABLE dbo.yt_object
GO

CREATE TABLE yt_object(
		sID				INT  NOT NULL, 				-- 主键,从yt_id中取
		xName			NVARCHAR(200) NOT NULL,		-- 存储过程名  -- 这是英文原名,不需要中文名
		rType_ID		INT NOT NULL,				-- 类型. 对应yt_type.sID
		xHint			NVARCHAR(200) NOT NULL,		-- 提示, 一般就是名称(中文名)
		xDesc			NVARCHAR(200) NOT NULL,		-- 描述
		xNote			NVARCHAR(MAX) NOT NULL,		-- 备注
		-- 系统字段
		rAuthor_ID		INT NOT NULL,				-- 创建者
		rOwner_ID		INT NOT NULL,				-- 当前拥有者
		rMender_ID		INT NOT NULL,				-- 提交
		rChecker_ID		INT NOT NULL,				-- 复核
		rAuditor_ID		INT NOT NULL,				-- 审核
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,			-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_object PRIMARY KEY CLUSTERED (sID)
)

GO
UPDATE dbo.yt_id SET xTableName = 'yt_object', sLastUpdate = GETDATE(), sStatus = 3, sVersion = 2 WHERE sID = 3
GO

--DROP TABLE dbo.yt_object_para
GO
CREATE TABLE dbo.yt_object_para(
		mID			INT NOT NULL,
		dID			INT NOT NULL,
		sIndex		INT NOT NULL,
		rDic_ID		INT NOT NULL,				-- 关联的数据字典. 如果不关联数据字典, 则是0
		xMainName	NVARCHAR(200) NOT NULL,		-- 存储过程名
		xField		NVARCHAR(200) NOT NULL,		-- 参数名
		xName		NVARCHAR(200) NOT NULL,		-- 存储过程参数中文名
		xDesc		NVARCHAR(200) NOT NULL,		-- 参数描述
		xHint		NVARCHAR(MAX) NOT NULL,		-- 提示
		xNote		NVARCHAR(MAX) NOT NULL,		-- 备注
		rAuthor_ID	INT NOT NULL,				-- 作者
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,		-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_object_para PRIMARY KEY CLUSTERED (mID, dID)
)

GO


CREATE NONCLUSTERED INDEX idx_yt_object_para_xMainName  ON yt_object_para(xMainName)
GO


--DROP TABLE dbo.yt_object_col
GO
CREATE TABLE dbo.yt_object_col(
		mID				INT NOT NULL,
		dID				INT NOT NULL,
		sIndex			INT NOT NULL,
		rDic_ID			INT NOT NULL,			-- 关联的数据字典
		xMainName		NVARCHAR(200) NOT NULL,
		xField			NVARCHAR(200) NOT NULL,	-- 列名原名
		xName			NVARCHAR(200) NOT NULL,	-- 列名 中文名
		xType			INT NOT NULL,			-- 类型: 来自数据表, 来自汇总, 来自计算
		xTableName		NVARCHAR(200) NOT NULL,	-- 如果是来自数据表, 则这里是来源表
		xDesc			NVARCHAR(200) NOT NULL,
		xHint			NVARCHAR(MAX) NOT NULL,
		xNote			NVARCHAR(MAX) NOT NULL,
		--
		rAuthor_ID		INT NOT NULL,				-- 作者
		sCreateTime		DATETIME NOT NULL,
		sLastUpdate		DATETIME NOT NULL,
		sStatus			TINYINT NOT NULL,		-- 状态 1废弃(锁定), 2编辑, 3提交, 4复核, 5审核(锁定), 6锁定. 锁定时不允许其他人修改,只允许拥有者修改
		sVersion		INT NOT NULL,
		CONSTRAINT pk_yt_object_col PRIMARY KEY CLUSTERED (mID, dID)
)
GO
CREATE NONCLUSTERED INDEX idx_yt_object_col_xMainName ON dbo.yt_object_col(xMainName)

GO



-- 修改历史?! 用触发器实现
--DROP TABLE dbo.yt_log
GO

CREATE TABLE dbo.yt_log(
		sID				INT IDENTITY(1, 1),
		xDateTime		DATETIME,
		xTableName		NVARCHAR(200) NOT NULL,
		xField			NVARCHAR(200) NOT NULL,
		xType			INT NOT NULL,		-- 类型 1新增 2修改 3删除
		xPrevious		NVARCHAR(MAX) NOT NULL,
		xNext			NVARCHAR(MAX) NOT NULL,
		CONSTRAINT pk_yt_log  PRIMARY KEY  CLUSTERED (sID)
)

GO



-- 考虑:数据库版本, 生成更新代码
